//package com.york.jobmew.gateway.blackfilter;
//
//import cn.hutool.bloomfilter.BitMapBloomFilter;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.StrUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.yaml.snakeyaml.Yaml;
//
//import java.util.List;
//import java.util.Map;
//
///**
// * 黑名单过滤工具类
// * 基于布隆过滤器实现，绝对不存在而对存在有误判率
// */
//@Slf4j
//@Component
//public class BlackIpUtils {
//
//    private BitMapBloomFilter bloomFilter;
//
//    // 通过构造函数注入 BitMapBloomFilter
//    public BlackIpUtils(BitMapBloomFilter bloomFilter) {
//        this.bloomFilter = bloomFilter;
//    }
//
//    /**
//     * 判断 ip 是否在黑名单里
//     *
//     * @param ip 请求ip
//     * @return
//     */
//    public boolean isBlackIp(String ip) {
//        return bloomFilter.contains(ip);
//    }
//
//    /**
//     * 重建 ip 黑名单，当且仅当配置不一致才重构
//     *
//     * @param configInfo 本次读取的配置
//     */
//    public void rebuildBlackIp(String configInfo) {
//        if (StrUtil.isBlank(configInfo)) {
//            configInfo = "{}";
//        }
//
//        // 解析 yaml 文件
//        Yaml yaml = new Yaml();
//        Map map = yaml.loadAs(configInfo, Map.class);
//
//        // 获取 IP 黑名单
//        List<String> blackIpList = (List<String>) map.get("blackIpList");
//
//        // 加锁防止并发
//        synchronized (this) { // 使用 this 作为锁对象
//            if (CollUtil.isNotEmpty(blackIpList)) {
//                // 注意构造参数的设置
//                BitMapBloomFilter bitMapBloomFilter = new BitMapBloomFilter(100);
//                for (String blackIp : blackIpList) {
//                    bitMapBloomFilter.add(blackIp);
//                }
//                bloomFilter = bitMapBloomFilter; // 重新赋值
//            } else {
//                bloomFilter = new BitMapBloomFilter(100); // 重新赋值
//            }
//        }
//    }
//
//}